package fr.lteconsulting.hexa.rebind; import java.io.PrintWriter; import fr.lteconsulting.hexa.client.comm.FactoredInterface; import fr.lteconsulting.hexa.client.comm.FieldName; import com.google.gwt.core.ext.Generator; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.core.ext.typeinfo.JType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; public class DataProxyFastFactoryGenerator extends Generator { static String getDataProxyFastImplName( JType type ) { return type.getSimpleSourceName() + "Impl"; } public static void generateDataImpl( String className, JType type, SourceWriter sw, TreeLogger logger ) { sw.println( "protected " + className + "() {}" ); JClassType clazz = type.isInterface(); for( JMethod m : clazz.getMethods() ) { FieldName fnAnnotation = m.getAnnotation( FieldName.class ); assert (fnAnnotation != null) : "DataProxyFast factory needs FieldName annotation"; sw.println( "public final " + m.getReturnType().getParameterizedQualifiedSourceName() + " " + m.getName() + "()" ); sw.println( "{" ); sw.indent(); if( m.getReturnType().getSimpleSourceName().equals( "int" ) ) sw.println( "return getInt( \"" + fnAnnotation.fieldName() + "\" );" ); else if( m.getReturnType().getSimpleSourceName().equals( "String" ) ) sw.println( "return getString( \"" + fnAnnotation.fieldName() + "\" );" ); sw.outdent(); sw.println( "}" ); } } public static void generate( JType type, SourceWriter sw, TreeLogger logger ) { sw.println( "public <T> T getData( JavaScriptObject obj )" ); sw.println( "{" ); sw.indent(); // sw.println( "GWT.log( \"A Casting obj : \" + obj.toString() );" ); // sw.println( "GWT.log( \"Jsoncontent:\"+HexaTools.toJSON(obj) );" ); // sw.println( type.getSimpleSourceName() + // "ImplStd impl = "+type.getSimpleSourceName() + "ImplStd.as( obj );" // ); sw.println( "return (T)obj;" ); sw.outdent(); sw.println( "}" ); } @Override public String generate( TreeLogger logger, GeneratorContext ctx, String requestedClass ) throws UnableToCompleteException { TypeOracle typeOracle = ctx.getTypeOracle(); assert (typeOracle != null); JClassType remoteService = typeOracle.findType( requestedClass ); if( remoteService == null ) { logger.log( TreeLogger.ERROR, "Unable to find metadata for type '" + requestedClass + "'", null ); throw new UnableToCompleteException(); } if( remoteService.isInterface() == null ) { logger.log( TreeLogger.ERROR, remoteService.getQualifiedSourceName() + " is not an interface", null ); throw new UnableToCompleteException(); } FactoredInterface fiAnnotation = remoteService.getAnnotation( FactoredInterface.class ); JClassType fiType = typeOracle.findType( fiAnnotation.clazz().getName() ); logger.log( TreeLogger.INFO, "Generating " + remoteService.getSimpleSourceName() ); String createdClassName = remoteService.getSimpleSourceName() + "Impl";// requestedClassName // + // "Impl"; String fullCreatedClassName = remoteService.getPackage().getName() + "." + /* * "com.example.client.data.record." * + */remoteService.getSimpleSourceName() + "Impl";// requestedClass // + // "Impl"; String packageName = remoteService.getPackage().getName();// "com.example.client.data.record";// // remoteService.getPackage().getName(); /* * String dataImplName = fiType.getSimpleSourceName() + "ImplStd"; * PrintWriter pw2 = ctx.tryCreate( logger, packageName, dataImplName ); * if( pw2 != null ) { ClassSourceFileComposerFactory cf2 = new * ClassSourceFileComposerFactory( packageName, dataImplName ); * cf2.addImport( "fr.lteconsulting.hexa.client.comm.GenericJSO" ); cf2.addImport( * "com.google.gwt.core.client.JavaScriptObject" ); cf2.addImport( * "com.google.gwt.core.client.GWT" ); cf2.addImport( * "fr.lteconsulting.hexa.client.tools.HexaTools" ); cf2.addImplementedInterface( * fiType.getParameterizedQualifiedSourceName() ); cf2.setSuperclass( * "GenericJSO" ); //sw.println( * "static class "+getDataProxyFastImplName * (type)+" extends GenericJSO implements " * +type.getParameterizedQualifiedSourceName() ); SourceWriter sw2 = * cf2.createSourceWriter( ctx, pw2 ); generateDataImpl( fiType, sw2, * logger ); sw2.commit( logger ); } */ PrintWriter printWriter = ctx.tryCreate( logger, packageName, createdClassName ); if( printWriter == null ) { // logger.log( TreeLogger.INFO, requestedClass + // " : CANNOT CREATE PRINT WRITER", null ); return fullCreatedClassName; } ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory( packageName, createdClassName ); composerFactory.addImplementedInterface( requestedClass ); composerFactory.addImport( "com.google.gwt.core.client.GWT" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.tools.HexaTools" ); composerFactory.addImport( "java.util.ArrayList" ); composerFactory.addImport( "java.util.HashMap" ); composerFactory.addImport( "java.util.Iterator" ); composerFactory.addImport( "java.util.Map.Entry" ); // composerFactory.addImport( packageName + "." + dataImplName ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.GenericJSO" ); composerFactory.addImport( "com.google.gwt.core.client.JavaScriptObject" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.DataProxy" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.DataProxyFastFactories" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.IDataProxyFastFactory" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.Service" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.ServerComm" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.CachedServerComm" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.ResponseJSO" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.JSOArrayInteger" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.ServerComm.ServerCommCb" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.interfaces.ITablesManager" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.interfaces.IAsyncCallback" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.ServerComm.ServerCommMessageCb" ); composerFactory.addImport( "com.google.gwt.core.client.GWT" ); composerFactory.addImport( "com.google.gwt.core.client.JsArray" ); composerFactory.addImport( "com.google.gwt.core.client.JsArrayInteger" ); composerFactory.addImport( "com.google.gwt.core.client.JsArrayString" ); composerFactory.addImport( "com.google.gwt.http.client.URL" ); composerFactory.addImport( "com.google.gwt.user.client.Window" ); composerFactory.addImport( "com.google.gwt.user.client.rpc.AsyncCallback" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaDate" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaTime" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaDateTime" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.FactoredInterface" ); composerFactory.addImport( "com.google.gwt.json.client.JSONObject" ); SourceWriter sw = composerFactory.createSourceWriter( ctx, printWriter ); if( sw == null ) { logger.log( TreeLogger.ERROR, requestedClass + " : CANNOT CREATE SOURCEWRITER", null ); return fullCreatedClassName; // null, already generated } generate( fiType, sw, logger ); sw.commit( logger ); return fullCreatedClassName; } }